﻿using System;
using System.Collections.Generic;
using Cesave.Domain.Core.Specification;
using Cesave.Domain.PermisosModule.Contracts.CiclosFechas;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Infrastructure.CrossCutting.Logging;
using Cesave.Infrastructure.Data.Core;
using Cesave.Infrastructure.Data.PermisosModule.Context;

namespace Cesave.Infrastructure.Data.PermisosModule.Repositories
{
	public class CiclosFechaRepository
		: GenericRepositoryEx<CiclosFecha>, ICiclosFechaRepository
	{
		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="context"></param>
		/// <param name="traceManager"></param>
		public CiclosFechaRepository(IPermisosModuleContext context, ITraceManager traceManager)
			: base(context, traceManager)
		{
		}

		#endregion

		#region ICiclosFechaRepository Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="ciclosFechasByJuntaSpecification"></param>
		/// <param name="ciclosFechasByCicloSpecification"></param>
		/// <returns></returns>
		public IEnumerable<CiclosFecha> FindCiclosFechasByJuntaAndCiclo(CiclosFechasByJuntaSpecification ciclosFechasByJuntaSpecification, CiclosFechasByCicloSpecification ciclosFechasByCicloSpecification)
		{
			if (ciclosFechasByCicloSpecification == null)
				throw new ArgumentNullException("ciclosFechasByCicloSpecification");
			if (ciclosFechasByJuntaSpecification == null)
				throw new ArgumentNullException("ciclosFechasByJuntaSpecification");
			Specification<CiclosFecha> specification = new TrueSpecification<CiclosFecha>();
			specification &= ciclosFechasByJuntaSpecification;
			specification &= ciclosFechasByCicloSpecification;
			return GetBySpec(specification);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="ciclosFechasByJuntaSpecification"></param>
		/// <param name="ciclosFechasByCicloSpecification"></param>
		/// <param name="ciclosFechasByDateRangeSpecification"></param>
		/// <returns></returns>
		public IEnumerable<CiclosFecha> FindCiclosFechasByJuntaAndCicloAndDateRange(CiclosFechasByJuntaSpecification ciclosFechasByJuntaSpecification, CiclosFechasByCicloSpecification ciclosFechasByCicloSpecification, CiclosFechasByDateRangeSpecification ciclosFechasByDateRangeSpecification)
		{
			if (ciclosFechasByJuntaSpecification == null)
				throw new ArgumentNullException("ciclosFechasByJuntaSpecification");
			if (ciclosFechasByCicloSpecification == null)
				throw new ArgumentNullException("ciclosFechasByCicloSpecification");
			if (ciclosFechasByDateRangeSpecification == null)
				throw new ArgumentNullException("ciclosFechasByDateRangeSpecification");
			Specification<CiclosFecha> specification = new TrueSpecification<CiclosFecha>();
			specification &= ciclosFechasByJuntaSpecification;
			specification &= ciclosFechasByCicloSpecification;
			specification &= ciclosFechasByDateRangeSpecification;
			return GetBySpec(specification);
		}

		#endregion
	}
}